#include "API.H"
#include "../HLI/HLI.h"
#include "../math/math.h"

const char character_data[95][5];

void z_ledstring_putchar(char value, int block)
{
	int i;
	for(i = 0; i < 5; i++) {
		z_ledfb_set_column(block*5+i, character_data[value - 0x20][i]);
	}
}

void z_ledstring_putstring(char* string)
{
	int len = 0;
	while(len < 4 && string[len]) {
		z_ledstring_putchar(string[len], len);
		len++;
	}
	while(len < 4)  z_ledfb_clear_block(len++);
}

void z_ledstring_putscrollingstring(char* string, int position)
{
	int subposition, charposition, len = -1, i;
	while(string[++len]);
	position = z_lame_mod(position, len*5);
	subposition = z_lame_mod(position, 5);
	charposition = z_lame_div(position, 5);

	for(i = 0; i < 20; i++) {
		z_ledfb_set_column(i, character_data[string[charposition] - 0x20][subposition++]);
		if(subposition==5) {
			subposition = 0;
			if(!string[++charposition]) charposition = 0;
		}
	}
	while(i < 20) z_ledfb_set_column(i++, 0);
}

/*
void z_ledstring_putscrolling_string(char* string, int frame) {

}*/

/*
void z_ledstring_putstring_rightaligned(char* string)
{

}
*/



/*** Supported ASCII characters ***

ASCII	CHAR	ASCII	CHAR	ASCII	CHAR	ASCII	CHAR	ASCII	CHAR	ASCII	CHAR
 0x20        0x30  0     0x40  @     0x50  P     0x60  `     0x70  p
 0x21  !     0x31  1     0x41  A     0x51  Q     0x61  a     0x71  q
 0x22  "     0x32  2     0x42  B     0x52  R     0x62  b     0x72  r
 0x23  #     0x33  3     0x43  C     0x53  S     0x63  c     0x73  s
 0x24  $     0x34  4     0x44  D     0x54  T     0x64  d     0x74  t
 0x25  %     0x35  5     0x45  E     0x55  U     0x65  e     0x75  u
 0x26  &     0x36  6     0x46  F     0x56  V     0x66  f     0x76  v
 0x27  '     0x37  7     0x47  G     0x57  W     0x67  g     0x77  w
 0x28  (     0x38  8     0x48  H     0x58  X     0x68  h     0x78  x
 0x29  )     0x39  9     0x49  I     0x59  Y     0x69  i     0x79  y
 0x2A  *     0x3A  :     0x4A  J     0x5A  Z     0x6A  j     0x7A  z
 0x2B  +     0x3B  ;     0x4B  K     0x5B  [     0x6B  k     0x7B  {
 0x2C  ,     0x3C  <     0x4C  L     0x5C  \     0x6C  l     0x7C  |
 0x2D  -     0x3D  =     0x4D  M     0x5D  ]     0x6D  m     0x7D  }
 0x2E  .     0x3E  >     0x4E  N     0x5E  ^     0x6E  n     0x7E  ~
 0x2F  /     0x3F  ?     0x4F  O     0x5F  _     0x6F  o

Note:
1. The ASCII character 0x20 is "SPACE" or a blank.
2. The ASCII character 0x7F(DEL) is not supported by the matrix below.

*/

const char character_data[95][5] = {
  {0x00, 0x00, 0x00, 0x00, 0x00},
  {0x00, 0x5F, 0x5F, 0x00, 0x00},
  {0x00, 0x07, 0x00, 0x07, 0x00},
  {0x14, 0x7F, 0x14, 0x7F, 0x14},
  {0x24, 0x2A, 0x7F, 0x2A, 0x12},
  {0x23, 0x13, 0x08, 0x64, 0x62},
  {0x36, 0x49, 0x55, 0x22, 0x50},
  {0x00, 0x05, 0x03, 0x00, 0x00},
  {0x00, 0x1C, 0x22, 0x41, 0x00},
  {0x00, 0x41, 0x22, 0x1C, 0x00},
  {0x14, 0x08, 0x3E, 0x08, 0x14},
  {0x08, 0x08, 0x3E, 0x08, 0x08},
  {0x00, 0x50, 0x30, 0x00, 0x00},
  {0x08, 0x08, 0x08, 0x08, 0x08},
  {0x00, 0x60, 0x60, 0x00, 0x00},
  {0x20, 0x10, 0x08, 0x04, 0x02},
  {0x3E, 0x51, 0x49, 0x45, 0x3E},
  {0x00, 0x42, 0x7F, 0x40, 0x00},
  {0x42, 0x61, 0x51, 0x49, 0x46},
  {0x22, 0x49, 0x49, 0x49, 0x36},
  {0x18, 0x14, 0x12, 0x7F, 0x10},
  {0x2F, 0x49, 0x49, 0x49, 0x31},
  {0x3E, 0x49, 0x49, 0x49, 0x32},
  {0x03, 0x01, 0x71, 0x09, 0x07},
  {0x36, 0x49, 0x49, 0x49, 0x36},
  {0x26, 0x49, 0x49, 0x49, 0x3E},
  {0x00, 0x36, 0x36, 0x00, 0x00},
  {0x00, 0x56, 0x36, 0x00, 0x00},
  {0x08, 0x14, 0x22, 0x41, 0x00},
  {0x14, 0x14, 0x14, 0x14, 0x14},
  {0x00, 0x41, 0x22, 0x14, 0x08},
  {0x02, 0x01, 0x51, 0x09, 0x06},
  {0x32, 0x49, 0x79, 0x41, 0x3E},
  {0x7C, 0x0A, 0x09, 0x0A, 0x7C},
  {0x7F, 0x49, 0x49, 0x49, 0x36},
  {0x3E, 0x41, 0x41, 0x41, 0x22},
  {0x7F, 0x41, 0x41, 0x41, 0x3E},
  {0x7F, 0x49, 0x49, 0x49, 0x41},
  {0x7F, 0x09, 0x09, 0x09, 0x01},
  {0x3E, 0x41, 0x49, 0x49, 0x7A},
  {0x7F, 0x08, 0x08, 0x08, 0x7F},
  {0x00, 0x41, 0x7F, 0x41, 0x00},
  {0x30, 0x40, 0x40, 0x40, 0x3F},
  {0x7F, 0x08, 0x14, 0x22, 0x41},
  {0x7F, 0x40, 0x40, 0x40, 0x40},
  {0x7F, 0x02, 0x0C, 0x02, 0x7F},
  {0x7F, 0x02, 0x04, 0x08, 0x7F},
  {0x3E, 0x41, 0x41, 0x41, 0x3E},
  {0x7F, 0x09, 0x09, 0x09, 0x06},
  {0x3E, 0x41, 0x51, 0x21, 0x5E},
  {0x7F, 0x09, 0x09, 0x09, 0x76},
  {0x26, 0x49, 0x49, 0x49, 0x32},
  {0x01, 0x01, 0x7F, 0x01, 0x01},
  {0x3F, 0x40, 0x40, 0x40, 0x3F},
  {0x1F, 0x20, 0x40, 0x20, 0x1F},
  {0x3F, 0x40, 0x38, 0x40, 0x3F},
  {0x63, 0x14, 0x08, 0x14, 0x63},
  {0x03, 0x04, 0x78, 0x04, 0x03},
  {0x61, 0x51, 0x49, 0x45, 0x43},
  {0x7F, 0x41, 0x41, 0x00, 0x00},
  {0x02, 0x04, 0x08, 0x10, 0x20},
  {0x00, 0x41, 0x41, 0x7F, 0x00},
  {0x04, 0x02, 0x01, 0x02, 0x04},
  {0x40, 0x40, 0x40, 0x40, 0x40},
  {0x00, 0x01, 0x02, 0x04, 0x00},
  {0x20, 0x54, 0x54, 0x54, 0x78},
  {0x7F, 0x48, 0x44, 0x44, 0x38},
  {0x38, 0x44, 0x44, 0x44, 0x20},
  {0x38, 0x44, 0x44, 0x48, 0x7F},
  {0x38, 0x54, 0x54, 0x54, 0x18},
  {0x08, 0x7E, 0x09, 0x01, 0x02},
  {0x0C, 0x52, 0x52, 0x52, 0x3E},
  {0x7F, 0x08, 0x04, 0x04, 0x78},
  {0x00, 0x44, 0x7D, 0x40, 0x00},
  {0x20, 0x40, 0x44, 0x3D, 0x00},
  {0x7F, 0x10, 0x28, 0x44, 0x00},
  {0x00, 0x41, 0x7F, 0x40, 0x00},
  {0x7C, 0x04, 0x18, 0x04, 0x78},
  {0x7C, 0x08, 0x04, 0x04, 0x78},
  {0x38, 0x44, 0x44, 0x44, 0x38},
  {0x7C, 0x14, 0x14, 0x14, 0x08},
  {0x08, 0x14, 0x14, 0x18, 0x7C},
  {0x7C, 0x08, 0x04, 0x04, 0x08},
  {0x48, 0x54, 0x54, 0x54, 0x20},
  {0x04, 0x3F, 0x44, 0x40, 0x20},
  {0x3C, 0x40, 0x40, 0x20, 0x7C},
  {0x1C, 0x20, 0x40, 0x20, 0x1C},
  {0x3C, 0x40, 0x38, 0x40, 0x3C},
  {0x44, 0x28, 0x10, 0x28, 0x44},
  {0x0C, 0x50, 0x50, 0x50, 0x3C},
  {0x44, 0x64, 0x54, 0x4C, 0x44},
  {0x00, 0x08, 0x36, 0x41, 0x00},
  {0x00, 0x00, 0x7F, 0x00, 0x00},
  {0x00, 0x41, 0x36, 0x08, 0x00},
  {0x08, 0x04, 0x08, 0x10, 0x08}};